
const dbConnection  =require('../db/connection')
const sequelize = require('../db/sequelize')

const User = require('../model/user')
const Article = require('../model/article')
const Tag = require('../model/tag')
const Comment = require('../model/comment')

//模型关系
// A.hasOne(B)  // A 有一个B
// A.belongsTo(B) //  A 属于 B
// A.hasMany(B) // A 有多个B
// A.belongsToMany(B,.关联表C.) // A属于多个B ..通过C

const initRelation = ()=>{
    //用户写文章： 用户和文章
    // 一对多个
    User.hasMany(Article,{
        onDelete:"CASCADE" //关联文章 也会删除
    })
    Article.belongsTo(User)

    //用户写评论: 用户和评论
    // 一对多
    User.hasMany(Comment,{
        onDelete:"CASCADE"
    })
    Comment.belongsTo(User)

    //用户喜欢文章：用户 - 文章
    // 多对多
    User.belongsToMany(Article,{
        through:"favorites",
        uniqueKey:false,
        timestamps:false
    })
    Article.belongsToMany(User,{
        through:"favorites",
        uniqueKey:false,
        timestamps:false
    })


    //用户之间关注 ： User (源模型) - User(目标模型)
    //关注关系:一个用户可以关注多个用户:一个用户也可以被多个用户关注
    User.belongsToMany(User,{
        through:'Followers', // 自动创建的模型 中间表
        as:"followers",  //别名 ： 'as' must be defined for many-to-many self-associations
        timestamps:false
    })


    //标签分类：文章和标签
    // 1 article     articleId1-tagsId1 
    // 1 tag         articleId1-tagsId2
    // 多对多         articleId2-tagsId1
    Article.belongsToMany(Tag,{
        through:"tagList",
        uniqueKey:false,
        timestamps:false
    })
    Tag.belongsToMany(Article,{
        through:"tagList", // 注意 ：名称唯一 
        uniqueKey:false,
        timestamps:false
    })

    //文章评论：文章 - 评论
    // 一对多
    Article.hasMany(Comment,{onDelete:"CASCADE"})
    Comment.belongsTo(Article)

}



const initDB = async ()=>{
    
    return new Promise(async (resove,reject)=>{
        try {  
            // 数据库连接
            await dbConnection()
            //初始化=> 模型 - 建表 ； 模型关系 - 表关系 
            initRelation()

            // models =>同步 到数据库
            // sequelize.sync()  
            // sequelize.sync({force:true}) 
            await sequelize.sync({alter:true})
            resove()
        } catch (error) {
            console.log(`myql connect fail on ${process.env.DB_PORT}`, error);
            reject(error)
        }
    })
}

module.exports = initDB